package com.bitoon.basketdudes.ws;

import com.bitoon.basketdudes.jpa.*;
import java.util.*;
import javax.naming.*;
import javax.persistence.*;
import javax.servlet.http.*;
import org.apache.log4j.*;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;

/**
 *
 * Webservices para gestión de gashaballs gratuitos y bonus diarios de duddies
 *
 * @author Paco FELC 2012
 */
public class Bonus {

    Context     initContext = null;
    Context     envContext  = null;
    Logger      log = Logger.getLogger(DatosEquipo.class);

    EntityManagerFactory emfBasket         = null;

    public Bonus() {
        try {
            // JPA Units
            emfBasket   = PersistenceManager.getInstance().getEntityManagerFactory("jpa_basket");

        } catch (Exception e) {
            log.error("[ERROR][constructor]: No se puedo conectar a la base de datos: " , e);
        }
    }

    public String wsConsultarBonusDiario(HttpServletRequest request, HttpServletResponse response) {

        String          retorno = "";
        EntityManager   em = null;
        int             p_equipo_id=0;
        BonusDiario     bonus_diario=null;
        Date            hoy = Util.TruncaDia(new Date());

        try {
            HttpSession miSesion    = request.getSession(true);
            String      sesion_id   = miSesion.getId();

            em = emfBasket.createEntityManager(); // check 07.08.2012

            if ( request.getParameter("equipo_id") == null ) {
                throw new ExcepcionGeneral( -11, "Incorrect parameters");
            }
            p_equipo_id = Integer.parseInt(request.getParameter("equipo_id"));

            LoginAction la = new LoginAction();
            int aux_usuario_id = la.comprobarSesionEquipo(sesion_id,p_equipo_id,em);
            if ( aux_usuario_id <0 ) {
                throw new ExcepcionGeneral( -10, "Incorrect Sesion" + p_equipo_id + " " + sesion_id);
            }

            
            em.getTransaction().begin();

            bonus_diario = buscar ( em, p_equipo_id);

            retorno = "error=0;consecutivas="+bonus_diario.getConsecutivas()+";ahora="+Util.FechaFormateada(new Date()) + ";";
            if ( bonus_diario.getFecha().compareTo(hoy)<0 ) {
                retorno += "gratis=1;";
            } else {
                retorno += "gratis=0;";
            }

            List<EquipoGashaball>       lista_eq_ga     =null;

            // Buscamos el crédito de tiradas de gashaball de este equipo
            Query q = em.createNamedQuery("EquipoGashaball.findByEquipoId");
            q.setParameter("equipoId",    p_equipo_id    );
            lista_eq_ga = q.getResultList();

            String l_ids ="";
            String l_cant="";

            for(EquipoGashaball e : lista_eq_ga) {
                l_ids  += e.getEquipoGashaballPK().getGashaballId();
                l_cant += e.getCantidad();
            }

            retorno += "ig={" + l_ids  + "};";
            retorno += "tg={" + l_cant + "};";

            em.getTransaction().commit();

        } catch (ExcepcionGeneral ex) {
            log.error("[ERROR][consultarBonusDiario]: " , ex);
            retorno = "error="+ex.getCodigo()+";descripcion="+ex.getDescripion()+ ";";
            if ( em != null && em.getTransaction().isActive() )
                em.getTransaction().rollback();

        } finally {

            try { if (em != null) em.close(); } // revisado 09/08/2012
            catch (Exception e) {
                log.error("[ERROR][constructor]: EMT base de datos: " , e);
            }
        }

        return retorno;
    }

    public BonusDiario buscar ( EntityManager em, int p_equipo_id ) {
        BonusDiario bonus_diario=null;

        Query qc = em.createNamedQuery("BonusDiario.findByEquipoId");
        qc.setParameter("equipo_id"  , p_equipo_id);

        List<BonusDiario> lista_bonus = qc.getResultList();
        if (lista_bonus.isEmpty()) {
            bonus_diario = new BonusDiario( p_equipo_id, Util.FechaSiguiente(-1), 1, null );

log.debug( "f" + bonus_diario.getFGashaball() +" f "+ bonus_diario.getFecha() );
            em.persist( bonus_diario );
        } else {
            bonus_diario=lista_bonus.get(0);
        }
        return bonus_diario;
    }

    /* Comprueba si el gashaball diario gratuito ha sido consumido ya o no.
     * Además anota como consumido el gashaball.
     *
     * Retorno:
     *
     */

    public int consultarGashaballDiario ( EntityManager emt, int p_equipo_id ) {
        int                 retorno = -1;
        Date      hoy     = Util.TruncaDia(new Date());

        BonusDiario bonus_diario = buscar ( emt, p_equipo_id);

        if ( bonus_diario.getFGashaball()==null ||
             Util.TruncaDia(bonus_diario.getFGashaball()).compareTo(hoy)!=0 )
        {
            // Comprobamos si ayer consiguió el bonus para que siga acumulando
            Date f_ayer = Util.FechaSiguiente(-1);
            Date ayer = Util.TruncaDia(f_ayer);

            // Reseteamos los bonus consecutivos
            if ( bonus_diario.getFGashaball()==null ||
                 bonus_diario.getFGashaball().compareTo(ayer)!=0 ) {
log.debug(" RESET BONUS ----" + ayer + " " + bonus_diario.getFGashaball() );
                bonus_diario.setConsecutivas(0);
            }

            bonus_diario.setFecha(hoy);
            bonus_diario.setFGashaball(hoy);
            bonus_diario.setConsecutivas(bonus_diario.getConsecutivas()+1);

            return CalculaBonusDiario( bonus_diario.getConsecutivas() );
        }
        return retorno;
    }

    public int CalculaBonusDiario ( int consecutivas ) {
        if ( consecutivas>7)
            consecutivas=7;
        return 100 * (( consecutivas*consecutivas) - consecutivas + 3);
    }

    public boolean MomentoGanador ( EntityManager em, Equipo p_equipo ) {
        GashaballMomento mg = null;

        Query q = em.createNamedQuery("GashaballMomento.findGanador");
        List<GashaballMomento> lista = q.getResultList();
        if (lista.isEmpty()) {
            return false;
        } else {
            mg = lista.get(0);
            mg.setEquipo( p_equipo );
            return true;
        }
    }

    // Crea un momento ganador para el día de hoy
    public void CrearMomentoHoy ( EntityManager em ) {

        // Hacemos una tirada para la hora/minuto y segundo
        int h=(int)(Math.random()*24);
        int m=(int)(Math.random()*60);
        int s=(int)(Math.random()*60);

        // Tomamos la fecha actual
        Calendar hoy = Calendar.getInstance();

        // Creamos una nueva fecha
        GregorianCalendar momento = new GregorianCalendar(
                hoy.get(GregorianCalendar.YEAR),
                hoy.get(GregorianCalendar.MONTH),
                hoy.get(GregorianCalendar.DATE),
                h,m,s
                );

        // Persistimos el momento
        GashaballMomento nuevo = new GashaballMomento();

        nuevo.setFecha(momento.getTime());
        em.persist(nuevo);

    }

    public String wsMomentoGanadorCrear(HttpServletRequest request, HttpServletResponse response) {

        String          retorno = "";
        EntityManager   em = null;

        try {
            HttpSession miSesion    = request.getSession(true);
            String      sesion_id   = miSesion.getId();

            em = emfBasket.createEntityManager(); // check 07.08.2012
            em.getTransaction().begin();

            CrearMomentoHoy ( em );

            retorno = "error=0;";

            em.getTransaction().commit();

        } catch (Exception e) {
            log.error("[ERROR][crearMomento]: " , e);
            if ( em != null && em.getTransaction().isActive() )
                em.getTransaction().rollback();
        } finally {
            try { if (em != null) em.close(); } // revisado 09/08/2012
            catch (Exception e) {
                log.error("[ERROR] " , e);
            }
        }

        return retorno;
    }


}
